#include <iostream>
#include <ctime>
using namespace std;

unsigned int random(unsigned long long d)
{
    //常数b、c 和m 直接关系到所产生随机数序列的“随机”性能，要令LCG达到最大周期，应符合以下条件：
    /*
     * 一般b不为0。如果b为零，线性同余法变成了乘同余法，也是最常用的均匀型伪随机数发生器

     * b、c的值越大，产生的伪随机数越均匀

     * b、m如果互质，产生随机数效果比不互质好

     * m值得话最好是选择大的，因为m值直接影响伪随机数序列的周期长短

     * 一般选取方法：乘数b满足b=4p+1；增量c满足c=2q+1。其中p，q为正整数。
    */
    unsigned long long b = 4000000000000000001LL,
        c = 2000000000000000001LL,
        m = ULLONG_MAX;

    unsigned long long a = d;
    return (b * a + c) % m;
    // return (b * d + c) % m;
}

int main()
{

    int min, max, n;
    unsigned long long d;

    cout << "请输入产生随机数的范围：";
    cin >> min >> max;

    cout << "请输入产生随机数的个数：";
    cin >> n;

    cout << "请输入产生随机数的种子（输入 0 表示使用系统时间做种）：";
    cin >> d;
    if (!d) {
        d = time(NULL);
    }

    unsigned int val;
    cout << "产生的随机数为：（后一个数）" << endl;
    val = random(d);
    cout << val << "：" << min + val % (max - min + 1) << endl;
    for (int i = 1; i < n; i++)
    {
       val= random(val);
       cout << val << "：" << min + val % (max - min + 1) << endl;
    }

    system("pause");
    return 0;
}